1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.collect;
18
19 import static com.google.common.base.Preconditions.checkArgument;
20 import static com.google.common.base.Preconditions.checkElementIndex;
21 import static com.google.common.base.Preconditions.checkNotNull;
22 import static com.google.common.base.Preconditions.checkPositionIndex;
23 import static com.google.common.base.Preconditions.checkPositionIndexes;
24 import static com.google.common.base.Preconditions.checkState;
25 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
26 import static com.google.common.collect.CollectPreconditions.checkRemove;
27
28 import com.google.common.annotations.Beta;
29 import com.google.common.annotations.GwtCompatible;
30 import com.google.common.annotations.VisibleForTesting;
31 import com.google.common.base.Function;
32 import com.google.common.base.Objects;
33 import com.google.common.math.IntMath;
34 import com.google.common.primitives.Ints;
35
36 import java.io.Serializable;
37 import java.math.RoundingMode;
38 import java.util.AbstractList;
39 import java.util.AbstractSequentialList;
40 import java.util.ArrayList;
41 import java.util.Arrays;
42 import java.util.Collection;
43 import java.util.Collections;
44 import java.util.Iterator;
45 import java.util.LinkedList;
46 import java.util.List;
47 import java.util.ListIterator;
48 import java.util.NoSuchElementException;
49 import java.util.RandomAccess;
50
51 import javax.annotation.Nullable;
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 @GwtCompatible(emulated = true)
67 public final class Lists {
68 private Lists() {}
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84 @GwtCompatible(serializable = true)
85 public static <E> ArrayList<E> newArrayList() {
86 return new ArrayList<E>();
87 }
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 @GwtCompatible(serializable = true)
107 public static <E> ArrayList<E> newArrayList(E... elements) {
108 checkNotNull(elements);
109
110 int capacity = computeArrayListCapacity(elements.length);
111 ArrayList<E> list = new ArrayList<E>(capacity);
112 Collections.addAll(list, elements);
113 return list;
114 }
115
116 @VisibleForTesting static int computeArrayListCapacity(int arraySize) {
117 checkNonnegative(arraySize, "arraySize");
118
119
120 return Ints.saturatedCast(5L + arraySize + (arraySize / 10));
121 }
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138 @GwtCompatible(serializable = true)
139 public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {
140 checkNotNull(elements);
141
142 return (elements instanceof Collection)
143 ? new ArrayList<E>(Collections2.cast(elements))
144 : newArrayList(elements.iterator());
145 }
146
147
148
149
150
151
152
153
154
155 @GwtCompatible(serializable = true)
156 public static <E> ArrayList<E> newArrayList(Iterator<? extends E> elements) {
157 ArrayList<E> list = newArrayList();
158 Iterators.addAll(list, elements);
159 return list;
160 }
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180 @GwtCompatible(serializable = true)
181 public static <E> ArrayList<E> newArrayListWithCapacity(
182 int initialArraySize) {
183 checkNonnegative(initialArraySize, "initialArraySize");
184 return new ArrayList<E>(initialArraySize);
185 }
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203 @GwtCompatible(serializable = true)
204 public static <E> ArrayList<E> newArrayListWithExpectedSize(
205 int estimatedSize) {
206 return new ArrayList<E>(computeArrayListCapacity(estimatedSize));
207 }
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228 @GwtCompatible(serializable = true)
229 public static <E> LinkedList<E> newLinkedList() {
230 return new LinkedList<E>();
231 }
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253 @GwtCompatible(serializable = true)
254 public static <E> LinkedList<E> newLinkedList(
255 Iterable<? extends E> elements) {
256 LinkedList<E> list = newLinkedList();
257 Iterables.addAll(list, elements);
258 return list;
259 }
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277 public static <E> List<E> asList(@Nullable E first, E[] rest) {
278 return new OnePlusArrayList<E>(first, rest);
279 }
280
281
282 private static class OnePlusArrayList<E> extends AbstractList<E>
283 implements Serializable, RandomAccess {
284 final E first;
285 final E[] rest;
286
287 OnePlusArrayList(@Nullable E first, E[] rest) {
288 this.first = first;
289 this.rest = checkNotNull(rest);
290 }
291 @Override public int size() {
292 return rest.length + 1;
293 }
294 @Override public E get(int index) {
295
296 checkElementIndex(index, size());
297 return (index == 0) ? first : rest[index - 1];
298 }
299 private static final long serialVersionUID = 0;
300 }
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319 public static <E> List<E> asList(
320 @Nullable E first, @Nullable E second, E[] rest) {
321 return new TwoPlusArrayList<E>(first, second, rest);
322 }
323
324
325 private static class TwoPlusArrayList<E> extends AbstractList<E>
326 implements Serializable, RandomAccess {
327 final E first;
328 final E second;
329 final E[] rest;
330
331 TwoPlusArrayList(@Nullable E first, @Nullable E second, E[] rest) {
332 this.first = first;
333 this.second = second;
334 this.rest = checkNotNull(rest);
335 }
336 @Override public int size() {
337 return rest.length + 2;
338 }
339 @Override public E get(int index) {
340 switch (index) {
341 case 0:
342 return first;
343 case 1:
344 return second;
345 default:
346
347 checkElementIndex(index, size());
348 return rest[index - 2];
349 }
350 }
351 private static final long serialVersionUID = 0;
352 }
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409 static <B> List<List<B>>
410 cartesianProduct(List<? extends List<? extends B>> lists) {
411 return CartesianList.create(lists);
412 }
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469 static <B> List<List<B>>
470 cartesianProduct(List<? extends B>... lists) {
471 return cartesianProduct(Arrays.asList(lists));
472 }
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507 public static <F, T> List<T> transform(
508 List<F> fromList, Function<? super F, ? extends T> function) {
509 return (fromList instanceof RandomAccess)
510 ? new TransformingRandomAccessList<F, T>(fromList, function)
511 : new TransformingSequentialList<F, T>(fromList, function);
512 }
513
514
515
516
517
518
519 private static class TransformingSequentialList<F, T>
520 extends AbstractSequentialList<T> implements Serializable {
521 final List<F> fromList;
522 final Function<? super F, ? extends T> function;
523
524 TransformingSequentialList(
525 List<F> fromList, Function<? super F, ? extends T> function) {
526 this.fromList = checkNotNull(fromList);
527 this.function = checkNotNull(function);
528 }
529
530
531
532
533
534 @Override public void clear() {
535 fromList.clear();
536 }
537 @Override public int size() {
538 return fromList.size();
539 }
540 @Override public ListIterator<T> listIterator(final int index) {
541 return new TransformedListIterator<F, T>(fromList.listIterator(index)) {
542 @Override
543 T transform(F from) {
544 return function.apply(from);
545 }
546 };
547 }
548
549 private static final long serialVersionUID = 0;
550 }
551
552
553
554
555
556
557
558
559
560 private static class TransformingRandomAccessList<F, T>
561 extends AbstractList<T> implements RandomAccess, Serializable {
562 final List<F> fromList;
563 final Function<? super F, ? extends T> function;
564
565 TransformingRandomAccessList(
566 List<F> fromList, Function<? super F, ? extends T> function) {
567 this.fromList = checkNotNull(fromList);
568 this.function = checkNotNull(function);
569 }
570 @Override public void clear() {
571 fromList.clear();
572 }
573 @Override public T get(int index) {
574 return function.apply(fromList.get(index));
575 }
576 @Override public Iterator<T> iterator() {
577 return listIterator();
578 }
579 @Override public ListIterator<T> listIterator(int index) {
580 return new TransformedListIterator<F, T>(fromList.listIterator(index)) {
581 @Override
582 T transform(F from) {
583 return function.apply(from);
584 }
585 };
586 }
587 @Override public boolean isEmpty() {
588 return fromList.isEmpty();
589 }
590 @Override public T remove(int index) {
591 return function.apply(fromList.remove(index));
592 }
593 @Override public int size() {
594 return fromList.size();
595 }
596 private static final long serialVersionUID = 0;
597 }
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617 public static <T> List<List<T>> partition(List<T> list, int size) {
618 checkNotNull(list);
619 checkArgument(size > 0);
620 return (list instanceof RandomAccess)
621 ? new RandomAccessPartition<T>(list, size)
622 : new Partition<T>(list, size);
623 }
624
625 private static class Partition<T> extends AbstractList<List<T>> {
626 final List<T> list;
627 final int size;
628
629 Partition(List<T> list, int size) {
630 this.list = list;
631 this.size = size;
632 }
633
634 @Override public List<T> get(int index) {
635 checkElementIndex(index, size());
636 int start = index * size;
637 int end = Math.min(start + size, list.size());
638 return list.subList(start, end);
639 }
640
641 @Override public int size() {
642 return IntMath.divide(list.size(), size, RoundingMode.CEILING);
643 }
644
645 @Override public boolean isEmpty() {
646 return list.isEmpty();
647 }
648 }
649
650 private static class RandomAccessPartition<T> extends Partition<T>
651 implements RandomAccess {
652 RandomAccessPartition(List<T> list, int size) {
653 super(list, size);
654 }
655 }
656
657
658
659
660
661
662
663 @Beta public static ImmutableList<Character> charactersOf(String string) {
664 return new StringAsImmutableList(checkNotNull(string));
665 }
666
667 @SuppressWarnings("serial")
668 private static final class StringAsImmutableList
669 extends ImmutableList<Character> {
670
671 private final String string;
672
673 StringAsImmutableList(String string) {
674 this.string = string;
675 }
676
677 @Override public int indexOf(@Nullable Object object) {
678 return (object instanceof Character)
679 ? string.indexOf((Character) object) : -1;
680 }
681
682 @Override public int lastIndexOf(@Nullable Object object) {
683 return (object instanceof Character)
684 ? string.lastIndexOf((Character) object) : -1;
685 }
686
687 @Override public ImmutableList<Character> subList(
688 int fromIndex, int toIndex) {
689 checkPositionIndexes(fromIndex, toIndex, size());
690 return charactersOf(string.substring(fromIndex, toIndex));
691 }
692
693 @Override boolean isPartialView() {
694 return false;
695 }
696
697 @Override public Character get(int index) {
698 checkElementIndex(index, size());
699 return string.charAt(index);
700 }
701
702 @Override public int size() {
703 return string.length();
704 }
705 }
706
707
708
709
710
711
712
713
714
715
716
717
718 @Beta public static List<Character> charactersOf(CharSequence sequence) {
719 return new CharSequenceAsList(checkNotNull(sequence));
720 }
721
722 private static final class CharSequenceAsList
723 extends AbstractList<Character> {
724 private final CharSequence sequence;
725
726 CharSequenceAsList(CharSequence sequence) {
727 this.sequence = sequence;
728 }
729
730 @Override public Character get(int index) {
731 checkElementIndex(index, size());
732 return sequence.charAt(index);
733 }
734
735 @Override public int size() {
736 return sequence.length();
737 }
738 }
739
740
741
742
743
744
745
746
747
748
749
750
751
752 public static <T> List<T> reverse(List<T> list) {
753 if (list instanceof ImmutableList) {
754 return ((ImmutableList<T>) list).reverse();
755 } else if (list instanceof ReverseList) {
756 return ((ReverseList<T>) list).getForwardList();
757 } else if (list instanceof RandomAccess) {
758 return new RandomAccessReverseList<T>(list);
759 } else {
760 return new ReverseList<T>(list);
761 }
762 }
763
764 private static class ReverseList<T> extends AbstractList<T> {
765 private final List<T> forwardList;
766
767 ReverseList(List<T> forwardList) {
768 this.forwardList = checkNotNull(forwardList);
769 }
770
771 List<T> getForwardList() {
772 return forwardList;
773 }
774
775 private int reverseIndex(int index) {
776 int size = size();
777 checkElementIndex(index, size);
778 return (size - 1) - index;
779 }
780
781 private int reversePosition(int index) {
782 int size = size();
783 checkPositionIndex(index, size);
784 return size - index;
785 }
786
787 @Override public void add(int index, @Nullable T element) {
788 forwardList.add(reversePosition(index), element);
789 }
790
791 @Override public void clear() {
792 forwardList.clear();
793 }
794
795 @Override public T remove(int index) {
796 return forwardList.remove(reverseIndex(index));
797 }
798
799 @Override protected void removeRange(int fromIndex, int toIndex) {
800 subList(fromIndex, toIndex).clear();
801 }
802
803 @Override public T set(int index, @Nullable T element) {
804 return forwardList.set(reverseIndex(index), element);
805 }
806
807 @Override public T get(int index) {
808 return forwardList.get(reverseIndex(index));
809 }
810
811 @Override public int size() {
812 return forwardList.size();
813 }
814
815 @Override public List<T> subList(int fromIndex, int toIndex) {
816 checkPositionIndexes(fromIndex, toIndex, size());
817 return reverse(forwardList.subList(
818 reversePosition(toIndex), reversePosition(fromIndex)));
819 }
820
821 @Override public Iterator<T> iterator() {
822 return listIterator();
823 }
824
825 @Override public ListIterator<T> listIterator(int index) {
826 int start = reversePosition(index);
827 final ListIterator<T> forwardIterator = forwardList.listIterator(start);
828 return new ListIterator<T>() {
829
830 boolean canRemoveOrSet;
831
832 @Override public void add(T e) {
833 forwardIterator.add(e);
834 forwardIterator.previous();
835 canRemoveOrSet = false;
836 }
837
838 @Override public boolean hasNext() {
839 return forwardIterator.hasPrevious();
840 }
841
842 @Override public boolean hasPrevious() {
843 return forwardIterator.hasNext();
844 }
845
846 @Override public T next() {
847 if (!hasNext()) {
848 throw new NoSuchElementException();
849 }
850 canRemoveOrSet = true;
851 return forwardIterator.previous();
852 }
853
854 @Override public int nextIndex() {
855 return reversePosition(forwardIterator.nextIndex());
856 }
857
858 @Override public T previous() {
859 if (!hasPrevious()) {
860 throw new NoSuchElementException();
861 }
862 canRemoveOrSet = true;
863 return forwardIterator.next();
864 }
865
866 @Override public int previousIndex() {
867 return nextIndex() - 1;
868 }
869
870 @Override public void remove() {
871 checkRemove(canRemoveOrSet);
872 forwardIterator.remove();
873 canRemoveOrSet = false;
874 }
875
876 @Override public void set(T e) {
877 checkState(canRemoveOrSet);
878 forwardIterator.set(e);
879 }
880 };
881 }
882 }
883
884 private static class RandomAccessReverseList<T> extends ReverseList<T>
885 implements RandomAccess {
886 RandomAccessReverseList(List<T> forwardList) {
887 super(forwardList);
888 }
889 }
890
891
892
893
894 static int hashCodeImpl(List<?> list) {
895
896 int hashCode = 1;
897 for (Object o : list) {
898 hashCode = 31 * hashCode + (o == null ? 0 : o.hashCode());
899
900 hashCode = ~~hashCode;
901
902 }
903 return hashCode;
904 }
905
906
907
908
909 static boolean equalsImpl(List<?> list, @Nullable Object object) {
910 if (object == checkNotNull(list)) {
911 return true;
912 }
913 if (!(object instanceof List)) {
914 return false;
915 }
916
917 List<?> o = (List<?>) object;
918
919 return list.size() == o.size()
920 && Iterators.elementsEqual(list.iterator(), o.iterator());
921 }
922
923
924
925
926 static <E> boolean addAllImpl(
927 List<E> list, int index, Iterable<? extends E> elements) {
928 boolean changed = false;
929 ListIterator<E> listIterator = list.listIterator(index);
930 for (E e : elements) {
931 listIterator.add(e);
932 changed = true;
933 }
934 return changed;
935 }
936
937
938
939
940 static int indexOfImpl(List<?> list, @Nullable Object element) {
941 ListIterator<?> listIterator = list.listIterator();
942 while (listIterator.hasNext()) {
943 if (Objects.equal(element, listIterator.next())) {
944 return listIterator.previousIndex();
945 }
946 }
947 return -1;
948 }
949
950
951
952
953 static int lastIndexOfImpl(List<?> list, @Nullable Object element) {
954 ListIterator<?> listIterator = list.listIterator(list.size());
955 while (listIterator.hasPrevious()) {
956 if (Objects.equal(element, listIterator.previous())) {
957 return listIterator.nextIndex();
958 }
959 }
960 return -1;
961 }
962
963
964
965
966 static <E> ListIterator<E> listIteratorImpl(List<E> list, int index) {
967 return new AbstractListWrapper<E>(list).listIterator(index);
968 }
969
970
971
972
973 static <E> List<E> subListImpl(
974 final List<E> list, int fromIndex, int toIndex) {
975 List<E> wrapper;
976 if (list instanceof RandomAccess) {
977 wrapper = new RandomAccessListWrapper<E>(list) {
978 @Override public ListIterator<E> listIterator(int index) {
979 return backingList.listIterator(index);
980 }
981
982 private static final long serialVersionUID = 0;
983 };
984 } else {
985 wrapper = new AbstractListWrapper<E>(list) {
986 @Override public ListIterator<E> listIterator(int index) {
987 return backingList.listIterator(index);
988 }
989
990 private static final long serialVersionUID = 0;
991 };
992 }
993 return wrapper.subList(fromIndex, toIndex);
994 }
995
996 private static class AbstractListWrapper<E> extends AbstractList<E> {
997 final List<E> backingList;
998
999 AbstractListWrapper(List<E> backingList) {
1000 this.backingList = checkNotNull(backingList);
1001 }
1002
1003 @Override public void add(int index, E element) {
1004 backingList.add(index, element);
1005 }
1006
1007 @Override public boolean addAll(int index, Collection<? extends E> c) {
1008 return backingList.addAll(index, c);
1009 }
1010
1011 @Override public E get(int index) {
1012 return backingList.get(index);
1013 }
1014
1015 @Override public E remove(int index) {
1016 return backingList.remove(index);
1017 }
1018
1019 @Override public E set(int index, E element) {
1020 return backingList.set(index, element);
1021 }
1022
1023 @Override public boolean contains(Object o) {
1024 return backingList.contains(o);
1025 }
1026
1027 @Override public int size() {
1028 return backingList.size();
1029 }
1030 }
1031
1032 private static class RandomAccessListWrapper<E>
1033 extends AbstractListWrapper<E> implements RandomAccess {
1034 RandomAccessListWrapper(List<E> backingList) {
1035 super(backingList);
1036 }
1037 }
1038
1039
1040
1041
1042 static <T> List<T> cast(Iterable<T> iterable) {
1043 return (List<T>) iterable;
1044 }
1045 }